/*
Copyright (C) 2013-2021 LZE
Convex Hull:Graham
*/
#include<bits/stdc++.h>
#define INF 0x7fffffff
#define mod 1000000007
#define eps 1e-6
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N = 100010;
ll n;
struct vertex{
    double x,y;
};

double cross(vertex a,vertex b,vertex o){
    return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}
double dis(vertex a,vertex b){
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

vector<vertex> vertex_set;

vertex s[N];

bool cmp(vertex a,vertex b){
    double x = cross(a,b,vertex_set[0]);
    if(x > 0)return true;
    if(x == 0 && dis(a,vertex_set[0]) < dis(b,vertex_set[0]))return true;
    return false;
}

int main(){
    scanf("%lld",&n);
    vertex p;
    for(ll i = 0;i < n;i++){
        scanf("%lf%lf",&p.x,&p.y);
        vertex_set.push_back(p);
        if(p.y == vertex_set[0].y && p.x < vertex_set[0].x)swap(vertex_set[i],vertex_set[0]);
        else if(p.y < vertex_set[0].y)swap(vertex_set[i],vertex_set[0]);
    }
    sort(vertex_set.begin() + 1,vertex_set.end(),cmp);
    ll top = 0;
    s[++top] = vertex_set[0];
    for(ll i = 1;i < n;i++){
        while(top > 1 && cross(s[top],vertex_set[i],s[top - 1]) < 0)top--;
        s[++top] = vertex_set[i];
    }
    double ans = 0;
    for(ll i = 1;i < top;i++)ans += dis(s[i],s[i + 1]);
    ans += dis(s[1],s[top]);
    printf("%.2lf",ans);
    return 0;
}